<?php

namespace App\Http\Controllers\Site;

use App\Models\Address;
use App\Models\Collect;
use App\Models\Order;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//require_once public_path('org/wechat_pay/lib/WxPay.Api.php');
require_once public_path('org/wechat_pay/example/WxPay.NativePay.php');
class CenterController extends Controller
{
    public function __construct()
    {
        $this->middleware('user')->except(['wxPayResult']);
    }

    //渲染用户中心模板的方法
    public function luyou($where){
        //给用户中心专门写一个方法用来渲染用户中心的不同模板
        $vars = '';
        switch ($where){
            case 'address':
                $vars = Address::latest()->get();
                break;
            case 'collect':
                //如果是访问收藏页面就将当前用户的所有收藏集合渲染到收藏模板中去
                $vars = Collect::where('user_id',auth()->id())->get()->map(function ($value){
                    return $value->getCollectObject()->select('id','pics','price','title','description')->first();
                })->toArray();
                break;
            case 'order':
                //如果访问的是用户中心的订单管理页面,在这里展示当前用户的所有订单
                $vars= Order::where('user_id',auth()->id())->latest()->get();
                break;
            case 'orderinfo':
                //进入用户中心订单详情页,会通过地址栏传递过来一个订单编号order_num,要查看这个订单号的详情
                $vars = Order::where('user_id',auth()->id())->where('order_num',\request('order_num'))->first();
                break;
        }
        return view('site.center.center_'.$where,compact('vars'));
    }
    //订单支付模板的方法,$orderNum订单编号要放到前面,路由找到这个方法后会将路由参数中的值传递给这里的第一个变量
    public function orderPay($orderNum,Order $order){
        //获取当前订单的详细信息
        $order = $order->where('order_num',$orderNum)->first();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody(env('SITE_TITLE'));
        $input->SetAttach($orderNum);
        //商户单号
        $input->SetOut_trade_no("sdkphp123456789".date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
//        $input->SetNotify_url("http://paysdk.weixin.qq.com/notify.php");
        //扫码支付,用户支付之后微信会将用户支付的情况通过一个异步通知(post)的形式返回,所以需要一个处理微信返回通知的方法
        $input->SetNotify_url(route('site.wxPayResult'));
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id("123456789");
        $notify = new \NativePay();
        $result = $notify->GetPayUrl($input);
        $url2 = $result["code_url"];
        return view('site.pay',compact('url2','order'));

    }
    //扫码支付,用户支付之后微信会将用户支付的情况通过一个异步通知(post)的形式返回,所以需要一个处理微信返回通知的方法
    public function wxPayResult(Order $order){
        //支付完成后微信会将支付结果以post方式返回,但是微信不会带当前网站的csrf令牌,所以需要将这个方法设置csrf白名单,也就是设置当前post方法不需要验证csrf令牌
        //接收微信推送过来的通知
        //获取微信回调的数据,微信回调的数据格式是xml
        $content = file_get_contents('php://input');
        //将微信返回的数据转成对象
        $res = simplexml_load_string($content,'simpleXMLElement',LIBXML_NOCDATA);
        //将接收到的数据放到文件中读取出来
        file_put_contents('a.php',var_export($res,true));
        if ($res->return_code == 'SUCCESS'){
            //进入这个判断体说明用户已经支付成功可以修改相应订单的状态
           $order->where('order_num',$res->attach)->update(['status'=>'已付款']);
            //需要给微信返回一个已经收到通知的xml信息,通知微信不需要再发通知了
        $xml=<<<xml
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
xml;
            return $xml;
        }
    }

    //用户收藏的方法也放到这个控制器中
    //访问这个收藏方法需要传递两个参数,一个是收藏对象的模型名称,第二个是收藏对象的模型id.因为我要通过相应对象的模型关联的方式向多态表中存数据
    public function collect($model ,$id){
//        dd([$model,$id]);
//        除了上面的$model和$id这两个参数外,还会通过地址栏传递过来一个flag参数这个参数用来区分是新增收藏还是删除收藏
        //先拼凑出相应模型的"完全限定类名",由于用户可以收藏不同的对象,所以要根据前台传递过来的不同的模型名,拼凑出不同的"完全限定类名"
        $class = "App\Models\\".$model;
        //实例化相应的模型对象
        $obj =  $class::find($id);
//        首先通过动态属性的方式访问当前对象与收藏表的多态关联,如果当前对象已经收藏过就不能再收藏了
        //但是同一个商品虽然只能被同一个用户收藏一次,但是可以被不同的用户收藏多次,所以要判断当前用户的当前对象是否已经在收藏表中了,
        //首先判断当前用户是否已经收藏过当前这个商品
        $data = $obj->collect()->where('user_id',auth()->id())->first();
//        这里需要先判断用户是不是要删除某个收藏

        if ($data){
            //进入到这个判断体中说明当前用户已经收藏过这个商品了
            if (\request('flag') == 'delete'){
                //调用模型的delete()方法,删除模型
                $data->delete();
                return ['status'=>3,'message'=>'宝贝已经和你渐行渐远了'];
            }
            //进入这个方法体中说明当前用户已经收藏过这个商品了
            return ['status'=>'2','message'=>'已经收藏过这个商品'];
        }
        //执行到这里说明当前用户之前没有收藏过这个商品,这个时候就可以通过模型关联的方式向多态表中添加数据了
        //然后通过调用相应模型与收藏表的多态关联关系,向多态表中新增数据
         $obj->collect()->create(['user_id'=>auth()->id()]);
        return ['status'=>1,'message'=>'商品收藏成功'];
    }

    //异步检测订单支付状态的方法
    public function check_order_status(Order $order){
        $order_num = \request('order_num');
        $status = $order->where('order_num',$order_num)->value('status');
        if ($status=='未付款'){
            return ['valid'=>0,'message'=>'未付款'];
        }else{
            return ['valid'=>1,'message'=>$status];
        }
    }

    //xpay的测试
    public  function xpay(){
        return view('site.xpay');
    }
}
